package com.cskaoyan.javase.oop1._11static._1basic;
/**
 * 引例
 * 宠物公司新进了一批同样颜色的猫，创建一个类描述这批宠物
 * 注：创建该类时，给出一个静态成员变量和一个静态成员方法。
 *
 * static原理:
 * static修饰的成员，称之为静态成员，包括静态成员变量和静态成员方法。
 * 静态成员的访问并不依赖于创建对象，可以直接通过类名访问，其原因在于：
 * 随着类加载完毕，静态成员就存在，并且能够使用了！
 * 1. 静态成员变量在类加载过程中完成默认初始化具有默认值，然后进行一些其它赋值，类加载结束就可以访问了。
 *    静态成员变量的赋值也是先进行默认初始化，然后考虑其它赋值手段。
 * 2. 静态成员方法的二进制指令集合在类加载过程也准备完毕，可以调用了。
 *
 * 思考:
 *      1.访问类的静态成员,会不会触发该类的类加载?
 *          很显然是会的,因为静态成员需要在类加载时期进行初始化等一系列操作,必然触发该类类加载!
 *          总结类加载的时机:
 *              1.启动main方法
 *              2.new对象
 *              3.访问类的静态成员
 *     2.类加载最多只有一次,所以一个静态成员变量在整个类的全局是唯一的,是独一份的,是被共享的.
 *
 *
 * 静态成员变量的赋值，目前你已经知道的，在类加载时期的两种赋值方式：
 *
 * 1. 默认初始化，具有默认值。
 * 2. 显式赋值，声明时直接给出取值。
 *
 * 默认初始化也是永远的第一步，然后才会进行其它赋值方式。
 *
 * 稍稍解释一下:
 * 静态成员变量的默认初始化之所以永远第一步,是由于类加载的机制的保证的
 * 成员变量的默认初始化之所以是第一步,是JVM创建对象的机制保证的
 *      在任何程序员能够控制的给成员变量赋值的方式中,都是在默认初始化之后进行.
 *      你在给成员变量赋值时,对象已经存在了,并且成员变量也已经有默认值了
 *
 * 一定要注意：
 * 静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 *
 * 静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 *
 * 静态成员方法可不是在类加载过程中，会自动被调用的方法！！！
 *
 * 既然是方法，肯定遵循不调用就不执行的原则！
 *
 * @since 10:02
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // System.out.println(Cat.color);
        Cat.catchMouse();
    }
}
class Cat{
    // 全体猫颜色都一样,这个属性是属于类的,应该是静态成员变量
    static String color = "白色";
    // 价格,年龄等属性,每只猫可能都不同,那么它们是成员变量
    double price = 10;
    int age;

    public void showMoe(){
        System.out.println("喵喵喵!");
    }

    public static void catchMouse(){
        System.out.println("抓老鼠!");
    }
}